更新时间:2023-08-10 13:39
3D APIAPI是Application Programming Interface的缩写,是应用程序接口的意思,而3D API则是指显卡与应用程序直接的接口。3D API能让编程人员所设计的3D软件只要调用其API内的程序,从而让API自动和硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,从而大幅度地提高了3D程序的设计效率。
如果没有3D API在开发程序时,程序员必须要了解全部的显卡特性,才能编写出与显卡完全匹配的程序,发挥出全部的显卡性能。而有了3D API这个显卡与软件直接的接口,程序员只需要编写符合接口的程序代码,就可以充分发挥显卡的不必再去了解硬件的具体性能和参数,这样就大大简化了程序开发的效率。同样,显示芯片厂商根据标准来设计自己的硬件产品,以达到在API调用硬件资源时最优化,获得更好的性能。有了3D API,便可实现不同厂家的硬件、软件最大范围兼容。比如在最能体现3D API的游戏方面,游戏设计人员设计时,不必去考虑具体某款显卡的特性,而只是按照3D API的接口标准来开发游戏,当游戏运行时则直接通过3D API来调用显卡的硬件资源。
目前个人电脑中主要应用的3D API有DirectX和OpenGL。DirectX目前已经成为游戏的主流,市售的绝大部分主流游戏均基于DirectX开发,例如《帝国时代3》、《孤岛惊魂》 、《使命召唤2》、《Half Life2》等流行的优秀游戏。而OpenGL目前则主要应用于专业的图形工作站,在游戏方面历史上也曾经和DirectX分庭抗礼,产生了一大批的优秀游戏,例如《Quake3》、《Half Life》、《荣誉勋章》的前几部、《反恐精英》等,目前在DirectX的步步进逼之下,采用OpenGL的游戏已经越来越少,但也不乏经典大作,例如基于OpenGL的《DOOM3》以及采用DOOM3引擎的《Quake4》等等,无论过去还是现在,OpenGL在游戏方面的主要代表都是著名的id Software。
3D API能让编程人员所设计的3D软件只要调用其API内的程序,从而让API自动和硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,从而大幅度地提高了3D程序的设计效率。几乎所有的3D加速芯片都有自己专用的3D API,目前普遍应用的3D API有DirectX、OpenGL、Glide、Heidi等。
微软公司专为PC游戏开发的API,与Windows操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度,而且目前基本上是免费使用的。由于要考虑与各方面的兼容性,DirectX用起来比较麻烦、在执行效率上也未见得最优。
这是3Dfx公司为VOODOO系列3D加速卡设计的专用3DAPI,它可以最大限度发挥VOODOO系列芯片的3D图形处理功能,由于不考虑兼容性,其工作效率远比OpenGL和Direct 3D高,所以Glide是各3D游戏开发商优先选用的3D API。不过,这样一来就使得许多精美的3D游戏在刚推出时,只支持3Dfx公司的VOODOO系列3D加速卡,而其它类型的3D加速卡则要等待其生产厂商提供该游戏的补丁程序。
Heidi是一个由Autodesk公司提出来的规格。目前,采用Heidi系统的应用程序包括3D Studio MAX动画制作程序、Autodesk公司为AutoCAD R13开发的WHIP加速驱动程序。
(开放式图形接口)由Silicon Graphics公司开发,能够在Windows 95、Windows NT、Macos、Beos、OS/2、以及Unix上应用的API。由于OpenGL起步较早,一直用于高档图形工作站,其3D图形功能很强,超过DirectX,能最大限度地发挥3D芯片的巨大潜力。在Windows中已经全面支持DirectX和OpenGL。在OpenGL的1.2版中还增加了对3DNow。标准的支持。
雾化效果是3D的比较常见的特性,在游戏中见到的烟雾、爆炸火焰以及白云等效果都是雾化的结果。它的功能就是制造一块指定的区域笼罩在一股烟雾弥漫之中的效果,这样可以保证远景的真实性,而且也减小了3D图形的渲染工作量。
Shading(着色处理)
绝大多数的3D物体是由多边形(polygon)所构成的,它们都必须经过某些着色处理的手续,才不会以线结构(wire frame)的面目示人。着色处理分为Flat Shading平面着色、Gouraud Shading高洛德着色。
1.Flat Shading (平面着色):平面着色是最简单也是最快速的着色方法,每个多边形都会被指定一个单一且没有变化的颜色。这种方法虽然会产生出不真实的效果,不过它非常适用于快速成像及其它要求速度重于细致度的场合。
2.Gouraud Shading (高洛德着色): 这种着色的效果要好得多,它可对3D模型各顶点的颜色进行平滑、融合处理,将每个多边形上的每个点赋以一组色调值,同时将多边形着上较为顺滑的渐变色,使其外观具有更强烈的实时感和立体动感,不过其着色速度比平面着色慢得多。
简单地说这是一种让3D物件产生透明感的技术。屏幕上显示的3D物件,每个像素中有红、绿、蓝三组数值。若3D环境中允许像素能拥有一组α值,我们就称它拥有一个α通道。α值的内容,是记载像素的透明度。这样一来使得每一个物件都可以拥有不同的透明程度。比如说,玻璃会拥有很高的透明度,而一块木头可能就没什么透明度可言。α混合这个功能,就是处理两个物件在萤幕画面上叠加的时候,还会将α值列入考虑,使其呈现接近真实物件的效果。
分为Texture Mapping材质贴图、Mip MappingMip贴图、Bump Mapping凹凸贴图、Video Texture Mapping视频材质贴图。
1.Texture Mapping (材质贴图):是在物体着色方面最引人注意、也是最拟真的方法,同时也多为目前的游戏软件所采用。一张平面图像(可以是数字化图像、小图标或点阵位图)会被贴到多边形上。例如,在赛车游戏的开发上,可用这项技术来绘制轮胎胎面及车体着装。
2.MIP MAPPING (MIP贴图) 这项材质贴图的技术,是依据不同精度的要求,而使用不同版本的材质图样进行贴图。例如:当物体移近使用者时,程序会在物体表面贴上较精细、清晰度较高的材质图案,于是让物体呈现出更高层、更加真实的效果;而当物体远离使用者时,程序就会贴上较单纯、清晰度较低的材质图样,进而提升图形处理的整体效率。LOD(细节水平)是协调纹理像素和实际像素之间关系的一个标准。一般用于中、低档显卡中。
3.Bump Mapping凹凸贴图
(1) 浮雕贴图(Emboss bump mapping)
这种处理方式不用lighting models,而直接使用贴图明暗度来产生凸凹效果.玩过photoshop的都知道可以使用alpha通道对RGB图像进行混合,这种透明度直接混合出来的明暗看起来象平的,为了使用图像随灯光看起来有立体感的明暗度,一种简单的办法就是使用Emboss bumpmapping.
实现如下:
就是将原alpha通道值一分为二,一个是原alpha通道的亮度减半,另一个是反转alpha通道并将uv偏移灯光一点点,最后将两个alpha通道加起来再与原RGB图像进行混合,这样看起来明暗度偏离灯光使看起来立体感较强.另外这样的处理方式还可混合顶点色.
优缺点:
CPU使用较多,计算uv偏移值,可以直接用固定管道实现. 完全用贴图渲染,只实现了diffuse.
(2) 环境凹凸贴图(EMBM: Environment-mapped bump mapping)
这种贴图保存了du和dv两个偏差值,最常见的是用在水的反射渲染中对反射图进行干挠.使水面看起来产生涟漪的效果. 就是说dv和dv将会加到顶点对应反射图的uv中. dx中可以设置bump矩阵对它调整得以实时变化.
优缺点:
CPU占用少,可以使用固定管道实现.效率问题主要是在反射图(也就是Environment map)的渲染占用上,当然也可以采用假的静态反射图.
(3) 法线图(Normal mapping)
这种是比较流行的实时凹凸贴图方法,原理很简单,就是多边形上每一象素点如果用不同的法向量进行光照模型运算,那么就可得到不同的凹凸明暗度.
实现方法:
就是将多边形的法线保存在高位图的RGB中.然后程序读取来在ps中取出RGB作为法线进行光照模型的计算即可.
法线图中的法线值一般是以贴图空间(也就是切线空间,U为tangent向量,V为binormal向量,n为normal向量)来存放的,所以灯光到顶点的向量要先转到切线空间后再与法线进行光照运算即可.
优缺点:
CPU使用不多,用点光源效果较好,需要硬件支持DotProduct,光照实时变化.
(4)置换贴图(Displacement mapping)
这种需要硬件支持,在vs中真正改变几何顶点的位置,由此引起的几何细分需要处理大量的多边形,一般不能实时应用到.
(5) 自阴影(Self-shadowing bump maps)
法线图可以实现阴影动态变化,但实现不了自阴影,也就是说如果有凸块遮挡了光线,它不能实现遮挡产生的阴影.
一种叫horizon map的技术可以实现自阴影.这是一种从特定点向各方向记录可见水平高度(the elevation of the visible horizon)的纹理。
光源如果低于这个水平高度,就不会照亮对应的特定点。这可在切线空间对光源向量执行这种可见性检查,
就可以产生自阴影bump maps.
优缺点:
实现自阴影,占用过多纹理内存,计算量很大。
(6) 视差映射(Parallax mapping)
从渲染点出发到眼睛的斜射线上找到表面垂直距离等于渲染点对应的Parallax mapping高度值时,那么眼睛斜射线上到表面垂直相交的那点就是要偏移到的地方.(可参见前面所附链接中的图示)
优缺点:
视差映射跟EMBM一样也是调整贴图uv坐标的,不过它有两个约束条件:一是对应视差映射中的高度值二是到眼睛的射线. 从而随视角变化而变化,效果效率都很好. 而EMBM一般用正/余弦波来改变du/dv后再去影响贴图坐标从而达到水的涟渏效果(这在前面有说)
(7) Z-correct bump mapping
这种是在ps中根据视线方向偏移Z值,使物体相交处会随着表面的凹凸情况发生变化而不仅仅表示为一条直线。
优缺点:
物体相交处通过z偏移表现凹凸变化,在pixel shader中修改Z值会禁止图形硬件的早期深度测试优化.
4.Video Texture Mapping视频材质贴图,这是目前最好的材质贴图效果。具有此种功能的图形图像加速卡,采用高速的图像处理方式,将一段连续的图像(可能是即时运算或来自一个AVI或MPEG的档案)以材质的方法处理,然后贴到3D物件的表面上去。
DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。
DirectX 5.0
微软公司并没有推出DirectX 4.0,而是直接推出了DirectX 5.0。此版本对Direct3D做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。
DirectX 6.0
DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX则得到了大多数厂商的认可。DirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。
DirectX 7.0
DirectX 7.0最大的特色就是支持T&L,中文名称是“坐标转换和光源”。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换;3D游戏中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现。在T&L问世之前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显示卡的GPU来计算,这样就可以把CPU从繁忙的劳动中解脱出来。换句话说,拥有T&L显示卡,使用DirectX 7.0,即使没有高速的CPU,同样能流畅的跑3D游戏。
DirectX 8.0
DirectX 8.0的推出引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader)与顶点渲染引擎(Vertex Shader),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,可以很容易的宁造出真实的水面动态波纹光影效果。此时DirectX的权威地位终于建成。
DirectX 9.0
2002年底,微软发布DirectX9.0。DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。
PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。
VS 2.0通过增加Vertex程序的灵活性,显著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。
增加对浮点数据的处理功能,以前只能对整数进行处理,这样提高渲染精度,使最终处理的色彩格式达到电影级别。突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。
DirectX 9.0c
与过去的DirectX 9.0b和Shader Model 2.0相比较,DirectX 9.0c最大的改进,便是引入了对Shader Model 3.0(包括Pixel Shader 3.0 和Vertex Shader 3.0两个着色语言规范)的全面支持。举例来说,DirectX 9.0b的Shader Model 2.0所支持的Vertex Shader最大指令数仅为256个,Pixel Shader最大指令数更是只有96个。而在最新的Shader Model 3.0中,Vertex Shader和Pixel Shader的最大指令数都大幅上升至65535个,全新的动态程序流控制、位移贴图、多渲染目标(MRT)、次表面散射 Subsurface scattering、柔和阴影 Soft shadows、环境和地面阴影 Environmental and ground shadows、全局照明(Global illumination)等新技术特性,使得GeForce 6、GeForce7系列以及Radeon X1000系列立刻为新一代游戏以及具备无比真实感、幻想般的复杂的数字世界和逼真的角色在影视品质的环境中活动提供强大动力。
因此DirectX 9.0c和Shader Model 3.0标准的推出,可以说是DirectX发展历程中的重要转折点。在DirectX 9.0c中,Shader Model 3.0除了取消指令数限制和加入位移贴图等新特性之外,更多的特性都是在解决游戏的执行效率和品质上下功夫,Shader Model 3.0诞生之后,人们对待游戏的态度也开始从过去单纯地追求速度,转变到游戏画质和运行速度两者兼顾。因此Shader Model 3.0对游戏产业的影响可谓深远。OpenGL OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。
OpenGL是个与.硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。由于OpenGL是3D图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS等3D图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数组。
在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。其中,Open Inventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。
OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。
OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成(如图一)。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。
目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的2.0版本面世,在其中加入了很多类似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高,未来的OpenGL发展前景迷茫。DirectX10.0技术分析 经过几年的发展,目前DirectX已经发展到了V9.0版本。DirectX9.0没有令我们失望,其所带来的电影级画面渲染效果给我们造成的震撼绝不亚于当年的Voodoo。但微软并没有止步不前。目前DirectX 9.0c的继任者DirectX 10已经呼之欲出,这种即将随同微软Windows Vista操作系统一同面世的DirectX API将再次撼动当今显示卡市场的格局,因为这又将是一个新时代的开始。下面我们将根据目前各方透露出来的信息来为大家介绍一下DirectX10将为我们带来什么样的最新特性。Shader Model 4.0 相信大家在选购显卡时已经都向是否支持DirectX9.0c看齐,而Shader Model 3.0则是DirectX9.0c最大的特色。虽然DirectX9.0c与DirectX9.0b仅仅只是一个字母之差,但DirectX9.0c所支持的SM3.0与DirectX9.0b所支持的SM2.0在功能、特效方面却有差很大的差别。在而呼之欲出的DirectX10中,Shader Model也将升级到Shader Model4.0,那么SM4.0比SM3.0优势在哪呢?
SM4.0规格令游戏程序开发员有更大的空间,相比原先的Shader Model 3.0自然继续有所提升,特别是对于最大指令数从512条增加到了64000条;暂存器数量也从原先的32个增加到惊人的4096个,而同时Texture由SM3.0的16个提升至128个,并硬件支持RGBE,令HDR不再需要特别的Decoding处理也能实现,HDR+AA将不再有这么多的麻烦。对于2D的纹理尺寸支持来看,DirectX 10也有惊人的提升,8192x8192的最高纹理分辩率比原先最高2048x2048的分辩率要高出许多。早在此前的E3上,微软就公布部分《飞行模拟X》的DX9/DX10的游戏画面对比。从画面上我们可以看到其水面效果十分的逼真,同时淡化了DirectX 9.0版本比较虚假的山脉在水中的倒影。值得注意的是,DirectX 10中将不在使用FP16数据,转而只支持FP32运算,并且也支持32位的纹理格式,可想而知,对于DirectX 10的显示卡来说,进行完全的FP32运算将可以获得更精细的画面。因此在完全DirectX 10的应用中,目前部分NVIDIA的DirectX 9c图形显示卡可能会出现不兼容或者运行效率低下的问题。统一渲染架构 相对SM4.0,其实在Shader Model 4.0中微软将引入统一着色架构,这才是DX10最大的更进。我们都知道,微软在DirectX 9中引入的了2.0/2.X/3.0三个版本的Vertex Shader(顶点着色引擎)以及Pixel Shader(像素着色引擎)。其中支持2.0版的着色引擎是DirectX 9的GPU的最低标准,而当前主流的显卡已经都硬件支持加入了拥有更多高级处理功能的3.0版本着色引擎。不过,即便是DirectX9.0c,对于功能相仿Vertex Shader、Pixel Shader来说,目前图形芯片厂商仍需要在GPU中划分两个区域来存放Vertex Shader阵列和Pixel Shader贴图流水线。这无疑是一种资源冗余,而且这也加重GPU的设计难度及成本。当Direct X10把渲染流程更细分为Vertex Shader、Geometry Shader及Pixel Shader,这个情况将会更为明显。那么,有没有可能把这两者整合在一起呢?答案就是肯定的!
而在DirectX 10中引入了统一渲染架,通过一个整合Vertex Shader、 Pixel Shader的可编程整合光影处理器来完成目前Vertex Shader、Pixel Shader所有的工作。所谓统一渲染架构,最容易的理解方式就是Shader单元不再分离,显示核心不再为Shader类型不同而配置不同类型的Shader单元,对于主流的显示核心,Pixel Shader单元以及vertex Shader单元的概念都应该已经非常熟悉了,而在统一渲染架构中这两种Shader单元将不再分离,转而所有的Shader单元都可以为需要处理的数据进行处理,不管和是Pixel Shader数据还是Vertex Shader数据。而调配哪几组Shader单元负责处理什么数据或者进行什么样子类型的计算,则由一个被称为small sets of instructions(SSI)的部分来控制。这样在硬件上,设计者就无需为不同的着色引擎设计不同的执行单元,只要按照所对应的接口以及操作方式全部融为一体,仅设置一种独立的Shader执行单元。这意味着GPU厂家可以用更小的核心来实现现在需要用8000万甚至更多晶体管才能实现的功能!
但由于Vertex和Pxiel Shader在很多焙蚨韵低车男枨罅渴遣煌?模?绾蔚髋洳煌?腟hader单元呢?针对这么问题,在DirectX 10中由一个单元来判定当前需要渲染场景的具体Vertex以及Pixel Shader的计算需求量,而根据这个需求量来分配Shader资源。由于采用统一渲染架构,所有Shader单元既可以处理Pixel Shader数据同时也可以处理Vertex Shader的数据,这样的资源合理利用率要高于普通的分离式Shader单元设计。
统一渲染架构是一项极具创新意义的作法。要知道,在很多时候如果我们处理的一个场景注意是以Pixel Shader计算为主,Vertex Shader计算仅占一小部分的时候,如果采用分离Shader设计的显示核心,就可能存在Vertex Shader计算单元空闲,但Pixel Shader单元过渡计算的现象。同样的也可能存在Pixel Shader数据比较少,但Vertex Shader计算数据过多的问题。这就往往造成了一方面着色单元闲置,另一方着色单元资源紧缺的情况。
比如在《上古卷轴4:埋没》,7900GTX 1600×1200 HDR,FPS仅为14~50帧左右。这是因为独立渲染的草丛或者树叶是由庞大数量的多边形构成,对GPU的顶点渲染提出了严酷的要求,相对来说并不需要太多像素操作,如此一来大规模的像素渲染被闲置而顶点模块处于不堪重负状态。而统一渲染架构则可以帮我们解决硬件资源上的限制----你能够不受限制地使用纹理资源,并可以使用任意长度的着色指令,如果能够将闲置的像素单元用来处理顶点,那么游戏速度就不会如此可怜了!此外,统一渲染架构将令GPU的角色由单纯为Game Rendering提升至Game Computing的理念,Unified Shading引擎设计更适合异类运算工作(Heterogeneous Computing),例如Physics运算、影像编码运算等,让显卡的应用范畴大幅提升。
其实ATI早在4年前就开始着手图形芯片统一渲染架构设计,比如ATI针对Xbox 360设计的Xenos图形芯片已经采用了Unified-Shader统一着色架构。在PC GPU方面,ATI方面也进行了缜密的安排,以保正旗下图形芯片平稳向DX10统一着色架构过渡。
比如R5xx当中采用的统一着色化的Ringbus内存总线,如控制像素单元的多线程“ Ultra-Threading Dispatch Processor ”(超线程分配处理器)。ATI这种做法将保正在2007年平稳地向R6xx图形芯片过渡,也就是说R6xx系列图形芯在采用统一渲染架构的同时,继续沿用R5xx的显存总线和超线程分配处理器,只是在性能上有所改进。
不过,目前NVIDIA方面似乎对统一渲染架构并不感兴趣,据之前多方面的消息表明,NV下一代旗舰G80芯片依然沿用传统的独立着色架构,但硬件规格上还是完整支持DX10,这是怎么回事呢?看来微软DX10似乎默许了G80的这种设计。但无论采用统一渲染架构还是独立渲染架构,DX10规格的GPU必须支持Shader Model 4.0。Geometry Shader技术 另外,DirectX 10还带有一个被称为Geometry Shader的新版“Shader”,可以处理Pixel Shaders和Vertex Shaders不能完成的任务。
目前DirectX的处理模式是:1.顶点数据准备;2.Vertex Shader;3.完成Vertex Shader;4.光栅化计算;5.PixelShader;6.完成PixelShader;这是一个D3D标准的处理模式,这个过程是是顺序进行的(DirectX 10之前)。因此,只能吸收和输出一个单独顶点的旧版Vertex Shaders是不能创建或者破坏三角形的。
而新的Geometry Shader的作用就是对每个Vertex数据临近的数据进行Vertex函数处理也就是用来判定临近的,类似数据操作的点来进行计算,而这种函数处理直接关系到整个渲染模型的形状;也就是说其可以快速的把模型类似的顶点结合起来进行快速运算,虽然其操作不会象Vertex Shader那样的进行完整的操作,只是处理器单个顶点的相关函数操作,但是这种操作却可以确定整个模型的物理形状,这将大大加速处理器速度,因为其它Shader单元将不再去需要判定数据所存在的位置,而只是需要简单的为特定区域进行操作就可以了。
不仅如此,在这些数据进入渲染引擎和Pixel Shader处理前,Geometry Shader能够制造新的原始体,添加新的三角形。Geometry Shader可以把处理数据直接输入内存,免除了先经过CPU处理才进入显卡流水线的麻烦,这一改进可以让GPU直接处理细微的粒状效果,如烟雾和爆炸效果等(在这之前这一任务通常交由CPU来完成)。玩游戏时,配合纹理阵列的Geometry Shader还可以制造出通常由六个方位才能创建的立方环境映射,而现在则只需通过一个方位就可以搞定。微软认为Geometry Shader可以把点、线、三角等多边形联系起来快速处理、同时创造非常漂亮的不规则多边形,并且可以在很短时间内直接分配给其它Shader单元和显存进行数据处理,而这一切都已经无需CPU干预了。因此微软认为,搭载Geometry Shader后,可以方便的实现复杂的烟雾、爆炸、皮毛、毛发等复杂图象;甚至可以模拟一些简单的运动轨迹等;而这些操作很多时候已经不再需要CPU的干预,因此自然可以更好的发挥系统的3D效率。
此外,Geometry Shader中还具备一个被称为Stream Out的技术,这种技术允许GPU可以重复利用已经计算的结果(允许继续由Vertex Shader数据来调用处理好的结果),从而减少计算,但是目前还不知道这种模式是如何实现的,毕竟这些已经操作过的数据暂存区会在哪里,其它计算单元又是如何进行数据请求了,这一切目前仍是个迷。虚拟显存技术 众所周知,在286/386时代,人们为了利用更多的内存,发明了虚拟寻址技术,今天,这项技术被用到显存身上,将如同当年般震撼,彻底地把显存的利用带到了全新的层次。
以往,GPU采用直接内存调用法则,无论是纹理、顶点、多边形、光影,都需要占用显存空间,这些数据的运算量越大,占据的空间也越多。为了避免每次都需要重新计算,人们想到了MIP-MAP纹理映射的方法。当时,纹理贴图的尺寸很小、3D场景亦没有这么复杂,MIP-MAP能够显著地减少GPU计算量和显存的占用。然而,随着3D游戏复杂性的增加,仅靠显存已经无法存储这些数据,不得不开发出AGP总线,利用部分内存作为AGP显存,来暂时存储纹理和顶点数据、补充显存容量的不足。但别说以前的AGP 8X,即使是今天带宽更大的PCI Express 16X,亦远远不能与显存带宽相比。更为严重的问题是,为了同步处理,GPU会降低显存的工作速度,使之与显卡显存顺利传输,所以一旦动用显存,系统速度会大为下降。从这方面看,在游戏中提升纹理调节的时候,必须注意自己的显存容量,比如你要玩FarCry、战地1942、等游戏,没有256MB显存,就别想把画质设置到最高,否则会大大地影响游戏速度。
因此,微软根据虚拟内存管理方法将在DirectX 10中引入虚拟显存技术。虚拟显存将可以很好的解决以上所提到的问题,所有的纹理、着色等都分成“小块”数据即使在低速总线上也能流畅传输。例如,一个4KB大小的页面相当于一个32×32×32bit大小的纹理贴图
而且将虚拟显存技术与着色引擎搭配也是一个很具创新性的想法。在显存中,着色器指令是被当作一个抽象的数据块进行处理的,系统并不理会“数据块”能否装得进GPU的指令流水线,一旦着色器被载入,它就会在每个顶点以及象素上操作、直至卸载。因此要想完成更长的着色器指令就需要增加GPU的指令执行管数或利用自动多路形式将指令划分成若干个可管理的小块。由于GPU的指令执行管数在设计之时就固定好,如果要增加执行管数无疑需要重新设计及增加晶体管数,显然第一种方法并不太实用。因此第二种方法较为实用,而这也与我们所提到的虚拟显存系统实际是一样的。为了适应着色器指令的执行应用,虚拟显存被划分为许多相对独立的页面。假定图形处理单元当中设置的指令执行管道可以执行整个页面所包含的指令,那么我们的着色器操作就可以建立起一套流水线式的运作机制,加载一个页面,然后运行,停止下来之后再加载一个新的页面,然后运行,如此反覆指导全部包含指令的页面被加载到处理器当中,此间,执行管道的作用与处理器的L1 Cache相当类似,而整个运作流程和处理器的可以说是一致的。通过虚拟显存技术,着色指令的长度将可以不受指令执行管数的限制,存储系统可以存放的图象纹理可以更多,寻址的方式变得轻松简单,于是我们的DirectX10技术就实现了可用资源“不受限制”的强大功能。当然了,资源的“不受限制”还是受到硬件实际可用资源的限制。指令太长的话,GPU就需要多次加载指令页面,这样也会造成性能大幅度下降;如果纹理数据太多,需要用到系统内存、甚至是硬盘空间进行存储的话,那么整个图形子系统的性能也会下降。针对这个问题,微软为资源限制定了两个门限:只要不超过第一个限定,系统都能够工作;而超过第二个限定时,系统就不能够正常工作(在640×480分辨率下,fps值不足10)。其实,此前已经有厂商使用了虚拟显存技术,3Dlab的专业级显卡野猫WildCat VP就能调度16GB虚拟显存,16GB哦,在主流显存不过256MB的时代,这是多么振奋人心的事情。很明显当你能完全使用全部16GB时,相信系统瓶颈问题已经不在此。整数指令集 除了统一渲染架构和虚拟显存,DX10还有不少改进之处,其中最重要的莫过于整数指令集。也许你会觉得奇怪,整数指令集不是所有计算的基础吗?对于CPU而言,这是没错的,但别忘记了,当然为何引入浮点处理器和多媒体指令集,原因是图形运算需要大量的浮点指令。浮点是不精确数据类型,当寻值数据与纹理数据不符合的时候,可以采用近似值和多个数据计算的内插值来代替,对图形最终画面没有影响,此类速度也比整数要快。因此,GPU的基础恰好与CPU相反,是以浮点指令为主的。目前,着色器所处理的所有东西都需要依靠浮点运算所完成(除了静态分支预测试运算之外)。
在大多数的图像处理上来说,这种处理方式是没有问题的。但进行动态分支预测或非内插式内存搜索时(比如对顶点缓存器进行定位索引时),这种浮点运算处理方式就存在很大的问题。而DX10中引入整数运算将有许多好处,比如进行动态/静态分支预测、顶点缓存定位、通用内存寻址方面,浮点是无法进行精确计算的。直接存取像素着色帧缓存 现在的渲染模式,主要是实时渲染,每种渲染工作都是实时完成的,中间无法打断,如果我们想为图像增加数字分级、色彩校正或颜色调节等工作,只能重新进行一次计算,对整体工作造成了延时。事实上,当你读取渲染中图象的纹理数据,大多数的GPU和驱动程序都可以工作。但这属于非法操作(没有经过定义),这样的操作随时可能被中断,而开发人员通常不会使用这项功能。
DX9时代的解决方案有二,第一种是使用两个独立的纹理,一个纹理用于正常工作,另一个备用纹理应付那些附加的计算,此方案的最大问题是必须占用两倍显存空间;第二种是在Pixel Shader中通过模拟混合函数的实现以上功能。ATi已经在他们的GPU芯片中加入了类似的做法,他们通过顶点着色引擎来模拟原有的固定顶点处理函数。这样就意味着GPU设计厂商需要在着色引擎上增加额外的晶体管来实现以上的功能。
DX10则转向了新思路:使用了像素描影器直接存取帧缓存的方式来部分代替以前的实时渲染,某些情况下,我们可以随时中断渲染,加入我们想要的效果,再继续运算,不对整个渲染过程造成影响,使渲染变得更为灵活和可控。但并不意味着在DirectX10中进行实时渲染模式就毫无问题,并且厂商可能放弃了对这种技术的支持。那样这项技术很可能以一种备选方案出现,如此一来,程序员可能会忽略这项技术的存在而继续沿用老方法增强型图形镶嵌技术 在DX8时代,为了提高曲线画面的真实度,显卡厂商增引入了高阶曲面技术,如:nVidia的RT-Patch和ATi的N-Patch。从本质上看,它们把曲线处理带入了一种新纪元,看看现有的真实世界,并不总是以方方正正的多边形存在的,很多地方都由曲面来构建,才使真实的物体种类更为多样,很难想像我们有一个四方头的时候是怎样的恐怖。然而,每次的技术进化总是有一定阻碍,高阶曲面在当时未能完善,甚至导致了画面产生变形。因此不少开发商都这种技术失去了兴趣,而图形芯片厂商最终也放弃对这项技术的硬件支持。直到DirectX 9引入适应图形镶嵌以及置换贴图技术,这两项技术再次被人们所关注。高阶曲面镶嵌以及置换贴图这两项技术虽然在NVIDIA的GF6*/7*系列、ATI的X1000系列图形芯片中得到支持,但当前DirectX技术在支持高阶曲面上仍存在一定问题。
虽然高阶曲面未能正式流行,而为它的自适应图形镶嵌和置换贴图两项独特的技术却引起了人们的兴趣。自适应图形镶嵌可以按照我们的要求,进行不同的纹理镶嵌,以便取得更佳的视觉效果,将使3D世界进一步拟真化,可是,它们遇到的最大问题,依然是高阶曲面的运算,如何使用最小的运算又不导致画面破损和变形,是DX10极须解决的问题。DX10的硬件将支持各种通用高阶曲面计算:Catmull-Rom曲面、贝赛尔曲线、B-Splines曲线、圆锥曲线,证明高阶曲面回归的时代已经到来,只是要我们去认真地进行优化而己。当然这些也需要图形芯片进行硬件支持。Physics(物理加速)技术 最近热门的技术就是物理加速及其应用,物理计算是下一代游戏体验当中的关键部分,它将增加游戏的真实感、沉浸感和带来更加有趣的体验。微软同样对物理加速非常感兴趣,在未来的DX10版本中会加入物理加速的支持。
虽然,物理加速的概念很早之前就已经提出,但时至今日依然处于概念性阶段——AGEIA的物理加速卡仅有几款游戏能够支持,而ATI的GPU物理加速才刚刚进行完Demo演示,NVIDIA的SLI物理加速也要等待游戏厂商采用Havok FX引擎才能够出台!推广进程如此缓慢因为标准的不统一。AGEIA和Havok两大阵营的物理加速引擎互不兼容、各自为政,这就使得很多游戏仅能支持一种物理引擎,这种情形非常类似于3D时代开荒初期在技术和规范上百花齐放!
这一现状有望在DX10推出之后得到改善,有了微软API的支持,无论哪种物理引擎都拥有发挥的空间,相信将会有更多的游戏加入更多的物理运算。未来,DX10 GPU将是更趋向化通用型的处理器,也就是说,原本许多交由CPU进行的3D处理会被转移到GPU上面来,因为强大的GPU比CPU更适合做这些工作,由此游戏性能会大幅提高。微软表示,DX10会开放两个SDK,分别照顾到AGEIA和Havok,其中AGEIA的PPU直接作用于SDK独立进行物理运算,在Havok引擎的调动下NVIDIA和ATI的GPU也可以动态的处理物理运算!
但令人遗憾的是,DX10最初版本将不支持物理加速功能,微软表示将在下一个DX10改进版(DX10.0b?)才会考虑引入此功能。
除以上几大改进之外,DirectX 10将不再采用“capabilities bit”的设计,也就是在驱动中定义一些“bit”来告诉系统这块显卡支持和不支持那些DirectX特效。